package com.atguigu.ssyx.controller;


import com.alibaba.fastjson.JSONObject;
import com.atguigu.ssyx.JwtHelper;
import com.atguigu.ssyx.common.auth.AuthContextHolder;
import com.atguigu.ssyx.common.constant.RedisConst;
import com.atguigu.ssyx.common.exception.SsyxException;
import com.atguigu.ssyx.common.result.Result;
import com.atguigu.ssyx.common.result.ResultCodeEnum;
import com.atguigu.ssyx.enums.UserType;
import com.atguigu.ssyx.model.user.User;
import com.atguigu.ssyx.service.IUserService;
import com.atguigu.ssyx.utils.ConstantPropertiesUtil;
import com.atguigu.ssyx.utils.HttpClientUtils;
import com.atguigu.ssyx.vo.user.LeaderAddressVo;
import com.atguigu.ssyx.vo.user.UserLoginVo;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/api/user/weixin")
public class WeixinApiController {
    @Autowired
    private IUserService userService;

    @Autowired
    private RedisTemplate redisTemplate;


    @GetMapping("/wxLogin/{code}")
    @ApiOperation(value = "微信登录获得code")
    public Result loginWX(@PathVariable String code) {
//        1.获得微信的code。

//        2.之后根据app_id和app_secret和code
        String wxOpenAppSecret = ConstantPropertiesUtil.WX_OPEN_APP_SECRET;
        String wxOpenAppId = ConstantPropertiesUtil.WX_OPEN_APP_ID;

//        地址 ?key=value&key1=value1
        StringBuffer url = new StringBuffer();
        url.append("https://api.weixin.qq.com/sns/jscode2session");
        url.append("?appid=%s");
        url.append("&secret=%s");
        url.append("&js_code=%s");
        url.append("&grant_type=authorization_code");

        String format = String.format(url.toString(), wxOpenAppId, wxOpenAppSecret, code);
        String result;
        try {
            result = HttpClientUtils.get(format);
        } catch (Exception e) {
            throw new SsyxException(ResultCodeEnum.ILLEGAL_REQUEST);
        }

//        3.返回  session_key和openid.
        JSONObject jsonObject = JSONObject.parseObject(result);

        String openid = jsonObject.getString("openid");
        System.out.println("openid" + openid);
        String sessionKey = jsonObject.getString("session_key");


//        4. 存入数据库user。表示该用户是否已经注册了。根据openId查询。
        User user = userService.getUserOpenId(openid);
        if (user == null) {
//            新用户
            user = new User();
            user.setOpenId(openid);
            user.setNickName("默认用户");
            user.setPhotoUrl("");
            user.setUserType(UserType.USER);
            user.setIsNew(0);
            userService.save(user);
        }


//        5.根据openId查询提货点和团长信息。
//        提货点信息
//        团长信息。
//        里面有团长和地址信息。
        LeaderAddressVo leaderAddressVo = userService.getLeaderAddressVoByUserId(user.getId());

//        6.使用jwt工具生成token。（userId和userName）
//        leaderAddressVo
//        注册后的用户拿到id和名称。
        String token = JwtHelper.createToken(user.getId(), user.getNickName());


//        7.获得当前用户登录用户信息。放到redis，设置有效时间。
        UserLoginVo userLoginVo = userService.getUserLoginVo(user.getId());

//使用RedisTemplate操作数据进行存储。
//        key是使用登录+用户id。保证唯一性。
        redisTemplate.opsForValue().set(RedisConst.USER_LOGIN_KEY_PREFIX + userLoginVo.getUserId(), userLoginVo, RedisConst.USERKEY_TIMEOUT, TimeUnit.DAYS);

        Map<String, Object> map = new HashMap<>();
//        token进行校验  ，  user进行保存显示用户信息。    leaderAddressVo显示用户的默认地址和团长信息。
        map.put("token", token);
        map.put("user", user);
        map.put("leaderAddressVo", leaderAddressVo);

//        8.使用map返回。
        return Result.ok(map);
    }
    @PostMapping("/auth/updateUser")
    @ApiOperation(value = "更新用户昵称与头像")
    public Result updateUser(@RequestBody User user) {
        System.out.println(user);
        User user1 = userService.getById(AuthContextHolder.getUserId());
        //把昵称更新为微信用户
        user1.setNickName(user.getNickName().replaceAll("[ue000-uefff]", "*"));
        user1.setPhotoUrl(user.getPhotoUrl());
        userService.updateById(user1);
        return Result.ok(null);
    }

}
